ποΈGitΠ―ΡΠ°ποΈ
Node / meshtastic / Meshtastic-Android / files / specs / 20260513-075218-lockdown-mode / data-model.md
specs/20260513-075218-lockdown-mode/data-model.md bc5cf83df7fd6b405ffc521d7c3ed4e1f3e8271a (bc5cf83d) Text, 3.58 KB
Data Model: Lockdown Mode
Feature: Lockdown Mode
Date: 2026-05-13
Domain Entities
LockdownState
The current implementation models lockdown UI state with a sealed class in T383838core/model.
βββββββββββββββββββββββ¬ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Variant β Fields β Description β
βββββββββββββββββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838None β β β No active lockdown prompt for the current connection β
β T383838NeedsProvision β β β Node requires initial passphrase provisioning β
β T383838Locked β T383838lockReason: String β Node is locked and awaiting authentication β
β T383838Unlocked β β β Current BLE session is authorized β
β T383838UnlockFailed β β β Firmware rejected the submitted passphrase and alloβ¦ β
β T383838UnlockBackoff β T383838backoffSeconds: Int β Firmware rejected the passphrase and rate-limited rβ¦ β
β T383838LockNowAcknowledged β β β Lock-now was acknowledged; client should disconnectβ¦ β
βββββββββββββββββββββββ΄ββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LockdownTokenInfo
Session TTL metadata is stored separately from T383838LockdownState.
ββββββββββββββββββ¬βββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Field β Type β Description β
ββββββββββββββββββΌβββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838bootsRemaining β T383838Int β Reboots remaining before the token expires β
β T383838expiryEpoch β T383838Long β Unix epoch seconds when the token expires; T3838380 means no time limit β
ββββββββββββββββββ΄βββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
StoredPassphrase
Encrypted cached passphrase metadata keyed by connected device address.
ββββββββββββββ¬βββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Field β Type β Description β
ββββββββββββββΌβββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838passphrase β T383838String β Non-empty passphrase string β
β T383838boots β T383838Int β Provisioning boot TTL cached alongside the passphrase β
β T383838hours β T383838Int β Provisioning hour TTL cached alongside the passphrase β
ββββββββββββββ΄βββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Storage key: sanitized device address string, not mesh node number.
Proto Mapping
FromRadio.lockdown_status -> ServiceRepository state
βββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Proto `BT383838`FdddLockdownStatus.State`f`b β Result β
βββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838NEEDS_PROVISION β T383838lockdownState = NeedsProvision β
β T383838LOCKED β auto-replay cached passphrase when available; otherwiβ¦ β
β T383838UNLOCKED β T383838lockdownState = Unlocked, T383838sessionAuthorized = true, T383838lβ¦ β
β T383838UNLOCK_FAILED with T383838backoff_seconds > 0 β T383838lockdownState = UnlockBackoff(backoffSeconds) β
β T383838UNLOCK_FAILED with T383838backoff_seconds == 0 β T383838lockdownState = UnlockFailed for manual submits; T383838Lockβ¦ β
β T383838STATE_UNSPECIFIED β No state change; warning logged β
βββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LockdownAuth -> AdminMessage (outgoing)
βββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββ¬ββββββ¬βββββββββββ
β Operation β `BT383838`Fdddpassphrase`f`b β `BT383838`Fdddboots_remaining`f`b β `BT383838`Fdddva`f`bβ¦ β `BT383838`Fdddlock_now`f`b β
βββββββββββββββΌββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββΌββββββΌβββββββββββ€
β Provision β user-entered UTF-8 string (1-64 byteβ¦ β UI-provided T383838boots β UIβ¦ β T383838false β
β Unlock β user-entered UTF-8 string β cached or submitted T383838boots β caβ¦ β T383838false β
β Auto-replay β cached T383838StoredPassphrase.passphrase β cached T383838boots β caβ¦ β T383838false β
β Lock Now β empty / ignored β T3838380 β T3838380 β T383838true β
βββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββ΄ββββββ΄βββββββββββ
Relationships
T282828
FromRadioPacketHandlerImpl -> LockdownCoordinator.handleLockdownStatus()
LockdownCoordinatorImpl -> LockdownPassphraseStore
LockdownCoordinatorImpl -> CommandSender
LockdownCoordinatorImpl -> ServiceRepository
LockdownCoordinatorImpl -> Lazy<MeshConnectionManager> (breaks DI cycle)
UIViewModel / ConnectionsViewModel -> ServiceRepository.lockdownState
RadioConfigViewModel -> ServiceRepository.lockdownTokenInfo / sessionAuthorized
LockdownDialog -> UIViewModel.sendLockdownUnlock() / disconnect callback
SecurityConfigScreen -> RadioConfigViewModel.sendLockNow()
Served by rngit 1.5.4 - Generated in 0.03s